package uba.algo3.tp2.ej1;

import static org.junit.Assert.*;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.StringTokenizer;
import java.util.Collection;
import java.util.Iterator;

import org.junit.Test;

public class MaximoTest {

	ArrayList<String> vecindades;
	Maximo e = new Maximo();
	
	@Test
	public void testObtenerMaximo()
	{		
		
		//----------PRUEBA MOSTRAR ARRAY HEAP------------
/*		Collection<Ciudad> c = new ArrayList<Ciudad>();
		
		Arista a1a = new Arista("c2",10); 
		Arista a1b = new Arista("c3",30);
		Arista a2a = new Arista("c1",10);
		Arista a2b = new Arista("c3",20);
		Arista a3a = new Arista("c1",30);
		Arista a3b = new Arista("c2",20);
			
		HashSet<Arista> A1 = new HashSet<Arista>();
		A1.add(a1a);
		A1.add(a1b);
		
		HashSet<Arista> A2 = new HashSet<Arista>();
		A2.add(a2a);
		A2.add(a2b);
		
		HashSet<Arista> A3 = new HashSet<Arista>();
		A3.add(a3a);
		A3.add(a3b);
		
		Ciudad c1 = new Ciudad(1,"c1",A1);
		Ciudad c2 = new Ciudad(2,"c2",A2);
		Ciudad c3 = new Ciudad(3,"c3",A3);
	
		c.add(c1);
		c.add(c2);
		c.add(c3);
		
		//Creacion de p y desencolar
		c3.cambiarPesoHastaAqui(Integer.MAX_VALUE);
		PriorityQueueExt<Ciudad> p = new PriorityQueueExt<Ciudad>(c);
		System.out.print("p: ");
		p.mostrarArrayHeap(); // [c3,c2,c1]
		System.out.println("Voy desencolando a p: ");
		p.poll();
		p.mostrarArrayHeap(); // [c1,c2]
		p.poll();
		p.mostrarArrayHeap(); // [c2]
		p.poll();
		p.mostrarArrayHeap(); // []
		
		//Creacion de p2 y desencolar
		c3.cambiarPesoHastaAqui(1);
		c2.cambiarPesoHastaAqui(2);
		c1.cambiarPesoHastaAqui(5);
		PriorityQueueExt<Ciudad> p2 = new PriorityQueueExt<Ciudad>(c);
		System.out.print("p2: ");
		p2.mostrarArrayHeap(); //[c1,c2,c3]
		System.out.println("Voy desencolando a p2: ");
		p2.poll();
		p2.mostrarArrayHeap(); // [c2,c3]
		p2.poll();
		p2.mostrarArrayHeap(); // [c3]
		p2.poll();
		p2.mostrarArrayHeap(); // []

		//Creacion de p3 y desencolar
		c3.cambiarPesoHastaAqui(4);
		c2.cambiarPesoHastaAqui(9);
		c1.cambiarPesoHastaAqui(1);
		PriorityQueueExt<Ciudad> p3 = new PriorityQueueExt<Ciudad>(c);
		System.out.print("p3: ");
		p3.mostrarArrayHeap(); //[c2,c1,c3]
		System.out.println("Voy desencolando a p3: ");
		p3.poll();
		p3.mostrarArrayHeap(); // [c2,c3]
		p3.poll();
		p3.mostrarArrayHeap(); // [c3]
		p3.poll();
		p3.mostrarArrayHeap(); // []
		
		/*
		Arista a4a = new Arista("c3",40);
		Arista a4b = new Arista("c4",40);
		Arista a5a = new Arista("c5",25);
		Arista a5b = new Arista("c2",25);
		
		HashSet<Arista> A4 = new HashSet<Arista>();
		A4.add(a4a);
		A4.add(a4b);
		
		HashSet<Arista> A5 = new HashSet<Arista>();
		A5.add(a5a);
		A5.add(a5b);
		
		Ciudad c4 = new Ciudad(4,"c4",A4);
		Ciudad c5 = new Ciudad(5,"c5",A5);
		
		Collection<Ciudad> cc = new ArrayList<Ciudad>();
		c4.cambiarPesoHastaAqui(5);
		c5.cambiarPesoHastaAqui(8);
		cc.add(c1);
		cc.add(c2);
		cc.add(c3);
		cc.add(c4);
		cc.add(c5);
		PriorityQueueExt<Ciudad> p4 = new PriorityQueueExt<Ciudad>(cc);
		p4.mostrarArrayHeap(); //da distinto a lo que me da a mi en papel
		*/
	
		
		
	
		
		
		/* Todos los casos probados aca funcionan tanto si descomento o comento el segundo IF del 
		 * obtenerMaximo */
		
		//----------TESTS DEL OBTENERMAXIMO------------
		representData("Richmond Sidney 3; Richmond Penrith 2; Sidney Penrith 1;");
		e = new Maximo();
		int pesoMaximo = e.obtenerMaximo("Penrith", "Sidney", vecindades); 
		assertEquals(2,pesoMaximo);
/*		
		representData("Kingaroy Caboolture 4; Caboolture Brisbane 3; Kingaroy Dalby 3; Dalby Brisbane 5;");
		e = new Maximo();
		pesoMaximo = e.obtenerMaximo("Kingaroy", "Brisbane", vecindades); 
		assertEquals(3,pesoMaximo);
		
		representData("Hamilton Ballarat 4; Hamilton Warmambool 7; Frankston Geelong 6; Ballarat Melbourne 5; Ballarat Geelong 5; Melbourne Frankston 7;");
		e = new Maximo();
		pesoMaximo = e.obtenerMaximo("Hamilton", "Melbourne", vecindades); 
		assertEquals(4,pesoMaximo);
		
		representData("Geelong Penrith 1; Sidney Penrith 2; Sidney Dalby 2; Dalby Penrith 2; Dalby Geelong 1;");
		e = new Maximo();
		pesoMaximo = e.obtenerMaximo("Sidney", "Geelong", vecindades); 
		assertEquals(1,pesoMaximo);
		
		representData("Sidney Geelong 3; Sidney Melbourne 2; Sidney Ballarat 3; Ballarat Penrith 2; Geelong Penrith 1; Geelong Melbourne 3; Geelong Ballarat 4; Melbourne Penrith 3;");
		e = new Maximo();
		pesoMaximo = e.obtenerMaximo("Sidney", "Penrith", vecindades); 
		assertEquals(3,pesoMaximo);
		
		representData("Zaraza Penrith 2; Zaraza Sidney 18; Sidney Geelong 3; Sidney Melbourne 2; Sidney Ballarat 3; Ballarat Penrith 2; Geelong Penrith 1; Geelong Melbourne 3; Geelong Ballarat 4; Melbourne Penrith 3;");
		e = new Maximo();
		pesoMaximo = e.obtenerMaximo("Sidney", "Zaraza", vecindades); 
		assertEquals(18,pesoMaximo);
		
		representData("A F 2; A D 4; A B 4; B F 3; B D 1; B C 3; B E 5; C D 5; C E 10; C G 2; E G 8; E H 7; G H 3;");
		e = new Maximo();
		pesoMaximo = e.obtenerMaximo("A", "G", vecindades);
		assertEquals(4,pesoMaximo);
		
		representData("A D 5; A B 7; B D 9; B E 7; B C 8; C E 5; D E 15; D F 6; E F 8; E G 9; F G 11;");
		e = new Maximo();
		pesoMaximo = e.obtenerMaximo("B", "F", vecindades);
		assertEquals(9,pesoMaximo);	
		
		representData("A B 20; A C 13; B D 14; C D 15; C E 14; D F 50; E F 50; F G 15; A G 16; D G 17; A D 21;");
		e = new Maximo();
		pesoMaximo = e.obtenerMaximo("A", "C", vecindades); 
		assertEquals(15,pesoMaximo);
		
		representData("A B 18; A C 19; B C 20; C D 16;");
		e = new Maximo();
		pesoMaximo = e.obtenerMaximo("A", "D", vecindades); 
		assertEquals(16,pesoMaximo);
*/		
}
	
	private void representData(String string)
	{
		 vecindades = new ArrayList<String>();
		
		StringTokenizer st = new StringTokenizer(string, ";");

		while(st.hasMoreTokens())
		{
			StringTokenizer s = new StringTokenizer(st.nextToken()," ");
			vecindades.add(s.nextToken());
			vecindades.add(s.nextToken());
			vecindades.add(s.nextToken());
		}
		
		
	}
	
}
